from flask_restful import reqparse,Api,Resource,marshal
from flask import jsonify,Blueprint
from models.courses import *
courses_bp = Blueprint('courses_bp',__name__,url_prefix='/course')

api = Api(courses_bp)

#获取所有的标签
from common.models_fields import *
from common.utils.login_ouath import login_required
class CoursesTag(Resource):

    def get(self):
        tag = CourseTag.query.filter_by().all()
        if tag:
            tag = marshal(tag,tag_fields)
            print(tag)
            return tag
api.add_resource(CoursesTag,'/all')


class Courses(Resource):
    def get(self):
        parser = reqparse.RequestParser()
        params_list = ['page', 'size', 'tag_id', 'free', 'online', 'sort']
        for i in params_list:
            parser.add_argument(i)
        args = parser.parse_args()
        page = args['page']
        size = args['size']
        tag_id = args['tag_id']  # 标签id   '' 全部
        free = args['free']  # 课程类别 ''  全部
        online = args['online']  # 课程状态 ''      全部  1 上线  0  即将上线
        sort = args['sort']  # 最新 ''          最热  2

        if (free == '') and (tag_id == "") and (online == ""):
            # 当类别  标签id  课程状态  为空字符串  获取全部最新课程
            courses = Course.query.all()
            data = marshal(courses, courses_fields)  # <class 'list'>
            if sort:  # TODO  最新最热
                new_data = self.hot_courses(data)  # 调用最热课程的方法 对数据排序
                return jsonify(message="获取成功", code=200, data=new_data)
            return jsonify(message="获取成功", code=200, data=data)
        if (free == '') and (tag_id == ''):
            # 当类别 标签  为空时  获取所有  类别  标签  下的文章
            # 根据课程的上线状态查询
            courses = Course.query.filter_by(course_status=online).all()
            data = marshal(courses, courses_fields)
            if sort:  # TODO  最新最热
                new_data = self.hot_courses(data)  # 调用最热课程的方法 对数据排序
                return jsonify(message="获取成功", code=200, data=new_data)
            return jsonify(message="获取成功", code=200, data=data)
        if (free == '') and (online == ""):
            # 当类别 上线状态  为空时  获取所有  类别    下的文章   # 根据   标签 查询
            # 查询 课程 标签表中的所有该标签的课程
            courses_tag = CourseTag.query.filter_by(id=tag_id).first()
            courses = courses_tag.course
            data = marshal(courses, courses_fields)
            if sort:  # TODO  最新最热
                new_data = self.hot_courses(data)  # 调用最热课程的方法 对数据排序
                return jsonify(message="获取成功", code=200, data=new_data)
            return jsonify(message="获取成功", code=200, data=data)
        if (online == '') and (tag_id == ''):
            # 当  标签 上线状态  为空时  获取所有  类别    下的文章

            courses = Course.query.filter_by(course_type=free).all()
            data = marshal(courses, courses_fields)
            if sort:
                new_data = self.hot_courses(data)  # 调用最热课程的方法 对数据排序
                return jsonify(message="获取成功", code=200, data=new_data)
            return jsonify(message="获取成功", code=200, data=data)
        if free == "":
            # 当 类别为空   根据标签  上线状态  查找数据
            # 通过标签查找到标签对象
            courses_tag = CourseTag.query.filter_by(id=tag_id).first()
            # 反向查课程
            courses = courses_tag.course
            # 列表推导式   加 判断 上线状态  加  marshal返回指定字段  得到最终需要的数据   这里 online是字符串   数据库是int
            courses_list = [marshal(i, courses_fields) for i in courses if i.course_status == int(online)]

            if sort:
                new_data = self.hot_courses(courses_list)  # 调用最热课程的方法 对数据排序
                return jsonify(message="获取成功", code=200, data=new_data)
            return jsonify(message="获取成功", code=200, data=courses_list)
        if tag_id == '':
            # 当标签为空   直接根据  类别 和上线状态 查找  即可
            courses = Course.query.filter_by(course_status=online, course_type=free).all()
            data = marshal(courses, courses_fields)
            if sort:
                new_data = self.hot_courses(data)  # 调用最热课程的方法 对数据排序
                return jsonify(message="获取成功", code=200, data=new_data)
            return jsonify(message="获取成功", code=200, data=data)

        if online == '':
            # 当  上线状态 为空    根据  类别 和标签  查找
            # 通过标签查找到标签对象
            courses_tag = CourseTag.query.filter_by(id=tag_id).first()
            # 反向查课程
            courses = courses_tag.course
            # 列表推导式   加 判断 类别  加  marshal返回指定字段  得到最终需要的数据
            courses_list = [marshal(i, courses_fields) for i in courses if i.course_type == free]
            print(courses_list)
            if sort:
                new_data = self.hot_courses(courses_list)  # 调用最热课程的方法 对数据排序
                return jsonify(message="获取成功", code=200, data=new_data)
            return jsonify(message="获取成功", code=200, data=courses_list)

        # 最后
        # 当全部都不为空   根据  类别  上线状态   标签查询
        # 通过标签查找到标签对象
        courses_tag = CourseTag.query.filter_by(id=tag_id).first()
        # 反向查课程
        courses = courses_tag.course
        # 列表推导式   加 判断 类别  和 在线状态    加  marshal返回指定字段  得到最终需要的数据
        courses_list = [marshal(i, courses_fields) for i in courses if
                        i.course_type == free and i.course_status == int(online)]
        print(courses_list)
        if sort:
            new_data = self.hot_courses(courses_list)  # 调用最热课程的方法 对数据排序
            return jsonify(message="获取成功", code=200, data=new_data)
        return jsonify(message="获取成功", code=200, data=courses_list)

    def hot_courses(self, data):
        new_data = sorted(data, key=lambda x: x['attention'], reverse=True)
        # new_data = data.sort(lambda x: x['attention'])
        return new_data

api.add_resource(Courses,'/course')


#获取课程详情
from flask import json
class CourseDetail(Resource):
    @login_required
    def get(self):
        parser = reqparse.RequestParser()
        parser.add_argument('cid')
        args = parser.parse_args()
        cid = args.get('cid')  # 课程id

        # 通过课程id  获取  课程
        course = Course.query.filter_by(id=cid).first()
        # 将课程信息序列化
        course_data = marshal(course, courses_fields)

        # 课程下的章节
        chapters = course.chapter

        # 章节下面的小节
        chapters_list = []
        for i in chapters:
            # 循环所有章  每一章序列化
            data_cha = marshal(i, chapters_fields)
            # 获取下面的节
            sections = i.sections
            # 序列化  然后添加到 章
            data_cha['sections'] = marshal(sections, sections_fields)
            chapters_list.append(data_cha)
        return jsonify(data={"course_ser": course_data, "section_ser": chapters_list}, code=200)


api.add_resource(CourseDetail,'/courseinfo')


class VideoResource(Resource):
    @login_required
    def get(self):
        parser = reqparse.RequestParser()
        parser.add_argument('sid')
        args = parser.parse_args()
        sid = args.get('sid')
        #获取视频地址
        section = Sections.query.filter_by(id=sid).first()
        return jsonify(message='获取成功',data={'video_url':section.video_url})
api.add_resource(VideoResource,'/sectionvideo')

